package com.example.caffeinecache01.service;

import com.example.caffeinecache01.entity.User;
import com.example.caffeinecache01.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * 说明：在 getUsersByName接口上添加了注解：@Cacheable。这是 缓存的使用注解之一，除此之外常用的还有 @CachePut和 @CacheEvit，分别简单介绍一下：
 *
 * @Cacheable：配置在 getUsersByName方法上表示其返回值将被加入缓存。同时在查询时，会先从缓存中获取，若不存在才再发起对数据库的访问
 * @CachePut：配置于方法上时，能够根据参数定义条件来进行缓存，其与 @Cacheable不同的是使用 @CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果，而是每次都会执行该方法，并将执行结果以键值对的形式存入指定的缓存中，所以主要用于数据新增和修改操作上
 * @CacheEvict：配置于方法上时，表示从缓存中移除相应数据。
 */
@Service
public class UserService{
    @Autowired
    private UserMapper userMapper;

    public List<User> getUsers() {
        return userMapper.getUsers();
    }

    public int addUser(User user) {
        return userMapper.addUser(user);
    }

    @Cacheable(value = "user",key = "#userName")
    public List<User> getUserByName(String userName) {
        List<User> users=userMapper.getUserByName(userName);
        System.out.println("从数据库中读取，而非从缓存读取!");
        return users;
    }


}